﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Notificacao
    {
        public Guid Identificador { get; set; }
        public int LoginId { get; set; }
        public Login Login { get; set; }
        public DateTime Data { get; set; }
        public string Titulo { get; set; }
        public string TipoNotificacao { get; set; }
        public string Menssagem { get; set; }
        private bool visualizado;
        private bool visualizadoChanged;
        public bool Visualizado { get { return this.visualizado; } set { this.visualizado = value; this.visualizadoChanged = true; } }
        public bool IsNew { get { return this.Data == DateTime.MinValue; } }
        public bool EnviarEmail { get; set; }

        public bool Salvar()
        {
            DataAccess.Notificacao notificacao = null;
            var result = false;
            Transaction.Begin(context =>
            {
                if (this.IsNew)
                {
                    notificacao = this.Insert(context);
                }
                else
                {
                    notificacao = this.Update(context);
                }
                return true;
            }).OnError(ex =>
            {
                throw ex;
            }).OnSuccess(() =>
            {
                if (this.EnviarEmail && this.Login != null)
                    EmailHelper.CurrentService.TrySend(Login.LoginText, this.Titulo, this.Menssagem, true, (ex) =>
                    {

                    });
                result = true;
            });
            return result;
        }

        private DataAccess.Notificacao Insert(DataAccess.SistemaCurricularEntities context)
        {
            var model = this.CreateModel(context);
            context.AddToNotificacao(model);
            return model;
        }

        private DataAccess.Notificacao Update(DataAccess.SistemaCurricularEntities context)
        {
            return this.CreateModel(context);
        }

        private DataAccess.Notificacao CreateModel(SistemaCurricularEntities context)
        {
            DataAccess.Notificacao notificacao = null;
            if (this.IsNew)
            {
                notificacao = new DataAccess.Notificacao();
                this.Data = DateTime.Now;
            }
            else
            {
                notificacao = context.Notificacao.FirstOrDefault(f => f.Data == this.Data && f.LoginId == this.LoginId);
                if (notificacao == null)
                    throw new Exception("Notificação inválida");
                this.Data = notificacao.Data;
            }
            notificacao.Data = this.Data;
            notificacao.LoginId = this.LoginId;
            notificacao.Mensagem = this.Menssagem;
            notificacao.TipoNotificacao = this.TipoNotificacao;
            notificacao.Titulo = this.Titulo;
            notificacao.Visualizado = this.Visualizado;
            
            return notificacao;
        }

        public static List<Notificacao> Listar(Notificacao notificacao)
        {
            if (notificacao == null)
                notificacao = new Notificacao();
            //notificacao.Data = notificacao.Data;

            var lista = new DataAccess.SistemaCurricularEntities().Notificacao.OrderByDescending(o => o.Data).Where(w => 
                    (notificacao.LoginId == 0 || w.LoginId == notificacao.LoginId) && 
                    (!notificacao.visualizadoChanged || w.Visualizado == notificacao.visualizado) &&
                    (notificacao.Data == DateTime.MinValue || w.Data == notificacao.Data)
                ).ToList().Select(
                    s => notificacao.Create(s)
                ).ToList();
            return lista;
        }

        private Lib.Notificacao Create(DataAccess.Notificacao model)
        {
            if(model == null)
                return new Notificacao();
            Lib.Notificacao item = new Notificacao();
            item.Identificador = Guid.NewGuid();
            item.Data = model.Data;
            item.EnviarEmail = false;
            item.Login = new Login().CreateLogin(model.Login);
            item.LoginId = model.LoginId;
            item.Menssagem = model.Mensagem;
            item.TipoNotificacao = model.TipoNotificacao;
            item.Titulo = model.Titulo;
            item.Visualizado = model.Visualizado;
            return item;
        }
    }
}